/**
 ******************************************************************************
 * @file           : string_utils.c
 * @brief          : String Utilities Implementation
 ******************************************************************************
 */

/* Includes ------------------------------------------------------------------*/
#include "string_utils.h"
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>

/* Private function prototypes -----------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/**
 * @brief       获取字符串长度
 */
uint32_t str_len(const char *str)
{
    uint32_t len = 0;
    
    if (str == NULL)
    {
        return 0;
    }
    
    while (*str++)
    {
        len++;
    }
    
    return len;
}

/**
 * @brief       字符串复制（安全版本）
 */
void str_copy(char *dst, const char *src, uint32_t max_len)
{
    uint32_t i;
    
    if (dst == NULL || src == NULL || max_len == 0)
    {
        return;
    }
    
    for (i = 0; i < max_len - 1 && src[i] != '\0'; i++)
    {
        dst[i] = src[i];
    }
    
    dst[i] = '\0';
}

/**
 * @brief       字符串比较
 * @retval      0=相等, >0=str1大, <0=str2大
 */
int32_t str_compare(const char *str1, const char *str2)
{
    if (str1 == NULL || str2 == NULL)
    {
        return 0;
    }
    
    while (*str1 && (*str1 == *str2))
    {
        str1++;
        str2++;
    }
    
    return *(const unsigned char*)str1 - *(const unsigned char*)str2;
}

/**
 * @brief       去除字符串首尾空格
 */
void str_trim(char *str)
{
    char *start, *end;
    
    if (str == NULL || *str == '\0')
    {
        return;
    }
    
    /* 去除开头空格 */
    start = str;
    while (is_space(*start))
    {
        start++;
    }
    
    /* 去除结尾空格 */
    end = str + str_len(str) - 1;
    while (end > start && is_space(*end))
    {
        end--;
    }
    
    /* 移动字符串 */
    *(end + 1) = '\0';
    if (start != str)
    {
        while (*start)
        {
            *str++ = *start++;
        }
        *str = '\0';
    }
}

/**
 * @brief       字符串转大写
 */
void str_upper(char *str)
{
    if (str == NULL)
    {
        return;
    }
    
    while (*str)
    {
        if (*str >= 'a' && *str <= 'z')
        {
            *str = *str - 32;
        }
        str++;
    }
}

/**
 * @brief       字符串转小写
 */
void str_lower(char *str)
{
    if (str == NULL)
    {
        return;
    }
    
    while (*str)
    {
        if (*str >= 'A' && *str <= 'Z')
        {
            *str = *str + 32;
        }
        str++;
    }
}

/**
 * @brief       字符串转整数
 */
int32_t str_to_int(const char *str)
{
    int32_t result = 0;
    int32_t sign = 1;
    
    if (str == NULL)
    {
        return 0;
    }
    
    /* 处理符号 */
    if (*str == '-')
    {
        sign = -1;
        str++;
    }
    else if (*str == '+')
    {
        str++;
    }
    
    /* 转换数字 */
    while (is_digit(*str))
    {
        result = result * 10 + (*str - '0');
        str++;
    }
    
    return result * sign;
}

/**
 * @brief       十六进制转字符串
 */
void hex_to_str(const uint8_t *hex, uint32_t len, char *str)
{
    const char hex_table[] = "0123456789ABCDEF";
    uint32_t i;
    
    if (hex == NULL || str == NULL)
    {
        return;
    }
    
    for (i = 0; i < len; i++)
    {
        str[i * 2] = hex_table[(hex[i] >> 4) & 0x0F];
        str[i * 2 + 1] = hex_table[hex[i] & 0x0F];
    }
    
    str[len * 2] = '\0';
}

/**
 * @brief       检查是否为数字
 */
bool is_digit(char ch)
{
    return (ch >= '0' && ch <= '9');
}

/**
 * @brief       检查是否为字母
 */
bool is_alpha(char ch)
{
    return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'));
}

/**
 * @brief       检查是否为字母或数字
 */
bool is_alnum(char ch)
{
    return is_alpha(ch) || is_digit(ch);
}

/**
 * @brief       检查是否为空白字符
 */
bool is_space(char ch)
{
    return (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r');
}
